/** 
 * @main    Plik z deklaracja klasy Identyfikacja sluzacej do identyfikacji
 *          obiektow dynamicznych metodą RMNK
 * @file    identyfikacja.h
 * @author  Grzegorz Sejnota
 *
 * @created on 19 marca 2009, 10:41
 * @version 0.0001
 */

#ifndef _IDENTYFIKACJA_H
#define	_IDENTYFIKACJA_H

#include "macierz.h"
#include <vector>
#include <deque>

//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
//++++++++++++++ POCZATEK [klasy Identyfikacja] ++++++++++++++++++++++++++++++++
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
/**
 * Klasa sluzaca do identyfikacji obiektow dynamicznych modelami parametrycznymi.
 * Klasa wykorzystuje rozszerzona, wazona, rekurencyjna metode najmniejszych
 * kwadratow. Parametrami metody sa stopnie wielomianow dA, dB, dC, dyskretny
 * czas opoznienia k oraz wspolczynnik wagi alfa.
 */
class Identyfikacja {
    // ---------- parametry metody ---------------------------------------------
    /** stopien wielomianu A */
    unsigned int dA;
    
    /** stopien wielomianu B */
    unsigned int dB;
    
    /** stopien wielomianu C */
    unsigned int dC;
    
    /** dyskretny czas opoznienia */
    unsigned int k;
    
    /** waga alfa */
    double alfa;
    
    // ---------- wektory sygnalow ---------------------------------------------
    /** wektor danych pomiarowych */
    Macierz wektorFi;
    
    /** wektor wyliczanych parametrow */
    Macierz wektorTheta;
    
    /** wektor pamieci wejsc */
    std::deque<double> pamiecU;
    
    /** wektor pamieci wyjsc */
    std::deque<double> pamiecY;
    
    /** wektor pamieci bledu */
    std::deque<double> pamiecE;
    
    
    // ---------- zmienne pomocnicze -------------------------------------------
    /** wektor parametrow k */
    Macierz wektorK;
    
    /** macierz P */
    Macierz macierzP;
    
    /** czas dyskretny - numer probki */
    int numerProbki;
    
    // ---------- metody prywatne ----------------------------------------------
    /* metoda aktualizujaca wektor pomiarow Fi */
    void aktualizujFi();
    
    /* metoda aktualizujaca wektory pamieci */
    void aktualizujPamiec(double, double);
    
    
public:
    /* konstruktor */
    Identyfikacja();
    
    /* konstruktor */
    Identyfikacja(int, int, int, int, double);
    
    /* konstruktor kopiujacy */
    Identyfikacja(const Identyfikacja & wzor);
    
    /* operator przypisania */
    Identyfikacja & operator=(const Identyfikacja &wzor);
    
    /* glowna metoda klasy - identyfikujaca */
    Macierz krokIdentyfikacji(double, double);
    
    /* glowna metoda klasy - identyfikujaca */
    Macierz stalySlad(double, double);
    
    /* pobranie wektora ocen parametrow */
    Macierz pobierzTheta() const;
    
    /* pobranie wektora pomiarow */
    Macierz pobierzFi() const;
    
    /* pobranie wielomianu A */
    std::vector<double> pobierzA() const;
    
    /* pobranie wielomianu B */
    std::vector<double> pobierzB() const;
    
    /* pobranie wielomianu C */
    std::vector<double> pobierzC() const;
};



#endif	/* _IDENTYFIKACJA_H */

